package com.rickpan.repository;

import com.rickpan.entity.TeamEncryptionKey;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 团队加密密钥数据访问层
 * 
 * @author RickPan Team
 * @version 1.0
 * @since 2025-07-19
 */
@Repository
public interface TeamEncryptionKeyRepository extends JpaRepository<TeamEncryptionKey, Long> {

    /**
     * 根据团队ID和激活状态查找密钥
     * 
     * @param teamId 团队ID
     * @param isActive 是否激活
     * @return 密钥实体
     */
    Optional<TeamEncryptionKey> findByTeamIdAndIsActive(Long teamId, Boolean isActive);

    /**
     * 根据团队ID查找所有密钥（按版本号降序）
     * 
     * @param teamId 团队ID
     * @return 密钥列表
     */
    List<TeamEncryptionKey> findByTeamIdOrderByKeyVersionDesc(Long teamId);

    /**
     * 根据团队ID和密钥版本查找密钥
     * 
     * @param teamId 团队ID
     * @param keyVersion 密钥版本
     * @return 密钥实体
     */
    Optional<TeamEncryptionKey> findByTeamIdAndKeyVersion(Long teamId, Integer keyVersion);

    /**
     * 获取团队的最大密钥版本号
     * 
     * @param teamId 团队ID
     * @return 最大版本号
     */
    @Query("SELECT MAX(k.keyVersion) FROM TeamEncryptionKey k WHERE k.teamId = :teamId")
    Optional<Integer> findMaxVersionByTeamId(@Param("teamId") Long teamId);

    /**
     * 将团队的所有密钥设为非激活状态
     * 
     * @param teamId 团队ID
     * @return 更新的记录数
     */
    @Modifying
    @Transactional
    @Query("UPDATE TeamEncryptionKey k SET k.isActive = false WHERE k.teamId = :teamId")
    int deactivateTeamKeys(@Param("teamId") Long teamId);

    /**
     * 删除过期的密钥
     * 
     * @param now 当前时间
     * @return 删除的记录数
     */
    @Modifying
    @Transactional
    @Query("DELETE FROM TeamEncryptionKey k WHERE k.expiresAt IS NOT NULL AND k.expiresAt < :now")
    int deleteExpiredKeys(@Param("now") LocalDateTime now);

    /**
     * 查找即将过期的密钥（用于提醒）
     * 
     * @param warningTime 警告时间点
     * @return 即将过期的密钥列表
     */
    @Query("SELECT k FROM TeamEncryptionKey k WHERE k.isActive = true AND k.expiresAt IS NOT NULL AND k.expiresAt BETWEEN :now AND :warningTime")
    List<TeamEncryptionKey> findKeysExpiringBefore(@Param("now") LocalDateTime now, @Param("warningTime") LocalDateTime warningTime);

    /**
     * 统计团队的密钥数量
     * 
     * @param teamId 团队ID
     * @return 密钥数量
     */
    @Query("SELECT COUNT(k) FROM TeamEncryptionKey k WHERE k.teamId = :teamId")
    long countByTeamId(@Param("teamId") Long teamId);

    /**
     * 查找指定时间后创建的密钥
     * 
     * @param createdAfter 创建时间下限
     * @return 密钥列表
     */
    List<TeamEncryptionKey> findByCreatedAtAfter(LocalDateTime createdAfter);

    /**
     * 检查团队是否存在激活的密钥
     * 
     * @param teamId 团队ID
     * @return 是否存在激活密钥
     */
    @Query("SELECT COUNT(k) > 0 FROM TeamEncryptionKey k WHERE k.teamId = :teamId AND k.isActive = true")
    boolean existsActiveKeyForTeam(@Param("teamId") Long teamId);
}
